perm filename CHAT.MID[NET,MRC]3 blob sn#620980 filedate 1981-10-23 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE CHAT
C00004 00003	INBUFH OUTBFH TTYBFH GOTINT RFCBLK HOST SMRBLK RMRBLK INPBLK CRLF BEEPC
C00006 00004	CHAT CHT00 CHT0 CHAT0 GOTHST HELP
C00009 00005	CHAT1 CHAT2
C00011 00006	LOOP TTILUP
C00013 00007	TTIDUN TTIDN1 TTIDN2 NTICHR FLUSH CLOSED
C00016 ENDMK
C⊗;
TITLE CHAT
SUBTTL Definitions

; Mark Crispin, SU-AI, October '81

; Prototype Ethernet user TELNET

; AC definitions

A=1

; System bit definitions

INTTTY==020000,,		; TTY input
INTCLK==000200,,		; clock interrupts
INTIMS==000020,,		; closed interrupt
INTINP==000010,,		; input interrupt
IODTER==100000			; Time out
IOBKTL==040000			; Mark seen
IODEND==020000			; End seen
BSACT== 000020			; activate on BS
SPCBRK==000100,,		; special activation mode
DISLIN==400000,,		; III
DMLIN== 040000,,		; DM
DDDLIN==020000,,		; DD
INTBTS==INTTTY\INTCLK\INTINP\INTIMS

; Macro to build an Ethernet host address
DEFINE HST NET,ADR
 <NET←8.>+ADR TERMIN
;INBUFH OUTBFH TTYBFH GOTINT RFCBLK HOST SMRBLK RMRBLK INPBLK CRLF BEEPC

SUBTTL Data area

INBUFH:	BLOCK 3			; input buffer
OUTBFH:	BLOCK 3			; output buffer
TTYBFH:	BLOCK 3			; TTY buffer header
GOTINT:	BLOCK 1			; -1 → got an interrupt

RFCBLK:	0			; connect to remote host
	0			; status word
	1			; socket number (1 for TELNET)
HOST:	0			; host

SMRBLK:	2			; send Mark
	0			; status word
	6			; Timing Mark Reply

RMRBLK:	3			; read last Mark
	0			; status word
	0			; Mark type returned here

INPBLK:	4			; skip if input available
	0			; status word

CRLF:	ASCIZ/
/

BEEPC:	-1			; assume beeping for default
;CHAT CHT00 CHT0 CHAT0 GOTHST HELP

SUBTTL Start of program

CHAT:	CAI
	RESET			; flush all I/O
	OUTSTR [ASCIZ/Host = /]
;  Totally cretinous host name parser.  Should be fixed to consult HOSTS2 or
; the IFS.  I never intended this program to be permanent!!
	SETZ A,
	INCHWL
	CAIN "?
	 JRST HELP
	CAIE "I			; IFS?
	 CAIN "i
	  MOVEI A,<HST 50,200>
	CAIE "D			; Diablo, DSN, DSN2?
	 CAIN "d
	  CAIA
	   JRST CHT00
	INCHWL
	CAIE "I
	 CAIN "i
	  MOVEI A,<HST 50,301>
	CAIE "S
	 CAIN "s
	  CAIA
	   JRST GOTHST
	INCHWL
	CAIE "N
	 CAIN "n
	  SKIPA A,[<HST 50,310>]
	   JRST GOTHST
	INCHWL
	CAIN "2
	 MOVEI A,<HST 50,311>
	JRST GOTHST

CHT00:
	CAIE "H			; St Helens?
	 CAIN "h
	  CAIA
	   JRST CHT0
	INCHWL
	CAIE "E
	 CAIN "e
	  MOVEI A,<HST 50,307>
	CAIE "P			; allow HPP-VAX
	 CAIN "p
	  MOVEI A,<HST 50,301>
	JRST GOTHST

CHT0:	CAIE "S			; Shasta, SAIL, SCORE, SUMEX?
	 CAIN "s
	  CAIA
	   JRST CHAT0
	INCHWL
	CAIE "A
	 CAIN "a
	  MOVEI A,<HST 50,302>
	CAIE "C
	 CAIN "c
	  MOVEI A,<HST 50,303>
	CAIE "H
	 CAIN "h
	  MOVEI A,<HST 50,300>
	CAIE "U
	 CAIN "u
	  MOVEI A,<HST 55,123>
	JRST GOTHST

CHAT0:	CAIE "T			; Tahona or Tiny?
	 CAIN "t
	  CAIA
	   JRST GOTHST
	INCHWL
	CAIE "A
	 CAIN "a
	  MOVEI A,<HST 50,312>
	CAIE "I
	 CAIN "i
	  MOVEI A,<HST 55,124>
GOTHST:
	JUMPN A,CHAT1
	OUTSTR [ASCIZ/Invalid host name - "?" for help.
/]
	CLRBFI
	JRST CHAT

HELP:	OUTSTR [ASCIZ/Host name, one of the following:
Diablo	DSN	DSN2	Helens	HPP-VAX	IFS	SAIL	SCORE
Shasta	SUMEX	Tahona	Tiny
/]
	CLRBFI
	JRST CHAT
;CHAT1 CHAT2

CHAT1:	INCHWL
	CAIE ↑J
	 CAIN 175
	  CAIA
	   JRST CHAT1
	MOVEM A,HOST
	HRROI [003000,,]
	TTYSET				; get line characteristics
	CAMN [-1]
	 EXIT				; how can I work if detached?
	TLNE (DISLIN\DMLIN\DDDLIN)	; display?
	 JRST CHAT2
	HRROI [001000,,(SPCBRK)]
	TTYSET
CHAT2:	SETACT [[	777777,,777777; activate on everything
			777777,,777777; just set it up for when we need it
			777777,,777777
			777777,,600000\BSACT]]
	OUTSTR [ASCIZ/ Trying... /]
	INIT
	 SIXBIT/PUP/
	 OUTBFH,,INBUFH
	 JRST [	OUTSTR [ASCIZ/Device PUP not available.  Try again later./]
		EXIT]
	INIT 1,
	 SIXBIT/TTY/
	 TTYBFH,,
	 JRST 4,CHAT
	MOVEI 8.		; change byte size in buffer header
	DPB [300600,,INBUFH+1]
	DPB [300600,,OUTBFH+1]
	INBUF
	OUTBUF
	OUTBUF 1,
	MTAPE RFCBLK
	 JRST [	OUTSTR [ASCIZ/Host dead/]
		EXIT]
	OUTSTR [ASCIZ/Open
/]
	PTJOBX [0 ? 3]
	LOCK
	SETZM GOTINT
	MOVEI [	SETOM GOTINT	; got an interrupt
		DISMIS]		; set up interrupt server
	MOVEM JOBAPR
	CLKINT 30.*60.		; keep alive counter
	MOVSI (INTBTS)
	INTENB			; enable interrupts
;	JRST LOOP
;LOOP TTILUP

LOOP:	INTMSK [0]		; mask off interrupts
	SKIPN GOTINT		; got an interrupt?
	 IMSTW [INTBTS]		; wait for an interrupt to happen
	SETZM GOTINT
TTILUP:	INCHSL			; get a byte from the TTY
	 JRST TTIDUN		; nothing, try input from the network
	CAIN ↑M			; if a CR,
	 INCHRW A		; flush the LF right after it
	CAIN 175		; ALT
	 MOVEI 33
	CAIN 176		; }
	 MOVEI 175
	CAIN 32			; ~
	 MOVEI 176
	CAIE 600\"L		; CONTROL-META-L is character mode
	 CAIN 600\"l
	  JRST [HRROI [001000,,(SPCBRK)]
		TTYSET
		JRST TTILUP]
	CAIE 400\"L		; META-L is line mode
	 CAIN 400\"l
	  JRST [HRROI [002000,,(SPCBRK)]
		TTYSET
		JRST TTILUP]
	CAIE 600\"Q		; CONTROL-META-Q exits
	 CAIN 600\"q
	  JRST FLUSH
	CAIE 400\"Q		; so does META-Q
	 CAIN 400\"q
	  JRST FLUSH
	CAIE 600\"G		; CONTROL-META-G
	 CAIN 600\"g
	  JRST [SETZM BEEPC	; disable beeping
		JRST TTILUP]
	CAIE 400\"G		; META-G
	 CAIN 400\"g
	  JRST [SETOM BEEPC	; enable beeping
		JRST TTILUP]
	ANDI 377		; turn off META bit
	TRZE 200		; CONTROL set?
	 ANDI 37
	SOSG OUTBFH+2		; space in buffer?
	 OUT
	  CAIA
	   JRST TTIDUN
	IDPB OUTBFH+1
	JRST TTILUP
;TTIDUN TTIDN1 TTIDN2 NTICHR FLUSH CLOSED

TTIDUN:	OUTPUT			; flush the output side of things
TTIDN1:	SOSLE INBUFH+2		; data available?
	 JRST NTICHR
	HRRZ A,INBUFH
	HRRZ A,(A)
	SKIPGE (A)		; anything in further buffers?
	 JRST TTIDN2
	MTAPE INPBLK		; no - new packet available?
	 JRST [	OUTPUT 1,
		STATZ IODEND
		 JRST CLOSED
		JRST LOOP]
TTIDN2:	IN			; yes - get it
	 JRST NTICHR
	GETSTS A
	TRZE A,IODEND\IODTER	; End seen?
	 JRST CLOSED
	TRZN A,IOBKTL		; Mark seen?
	 JRST 4,.-1
	SETSTS (A)		; yes, clear error status
	MTAPE RMRBLK
	 TRN
	MOVE RMRBLK+2		; get Mark type
;;	CAIN 1			; Data Mark?
;;	 AOS NTOINP
	CAIE 5			; Timing Mark?
	 JRST TTIDN1		; something random
	MTAPE SMRBLK		; yes, send Timing Mark Reply
	 JRST CLOSED
	JRST TTIDN1

NTICHR:	ILDB INBUFH+1
	SETO A,
	SKIPE BEEPC		; skip if not beeping π today
	 CAIE ↑G		; skip if need to beep
	  CAIA
	   BEEP A,
	CAIN 176		; ~
	 MOVEI 32
	CAIN 175		; }
	 MOVEI 176
	CAIN 33			; ALT
	 MOVEI 175
	SOSG TTYBFH+2		; output character to TTY
	 OUTPUT 1,
	IDPB TTYBFH+1
	JRST TTIDN1

FLUSH:	RELEASE			; flush connection
CLOSED:	OUTPUT 1,		; flush TTY buffer
	OUTSTR [ASCIZ/
Connection closed
/]
	EXIT

END CHAT